//Package controllers 权限认证
package controllers

import (
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/context"
	"github.com/astaxie/beego/orm"
	"gitee.com/lzqysoft/ga_wz_backend/libs/jwtbeego"
	m "gitee.com/lzqysoft/ga_wz_backend/models"
	"strconv"
)

//Check url权限验证，系统管理员权限不需检查
var Check = func(ctx *context.Context) {
	beego.Debug("start 检查开始")
	if ctx.Input.Is("OPTIONS") {
		return
	}
	user_auth_type, _ := strconv.Atoi(beego.AppConfig.String("user_auth_type"))
	//	auth_gateway := beego.AppConfig.String("auth_gateway")
	urls := ctx.Request.RequestURI
	beego.Debug("检查权限列表：：：：：：：：：：")
	//	验证token
	tokenstring := ctx.Input.Header("Authorization")
	jwt, _, err := jwtbeego.Parse(tokenstring)
	if err != nil {
		retCtxErr(ctx, ErrToken)
	}
	// if !m.CheckUser(jwt.Userid) {
	// 	retCtxErr(ctx, ErrToken)
	// }
	// if !m.CheckOrganization(jwt.Orgid) {
	// 	retCtxErr(ctx, ErrToken)
	// }
	user, err := m.GetUserById(jwt.Userid)
	//	role, err := m.GetRoleByUserId(jwt.Userid)
	if err != nil {
		retCtxErr(ctx, ErrToken)
	}
	//用户角色为系统管理员则不验证权限
	if user.Role[0].Type <= 1 {
		return
	}
	if user_auth_type > 0 {
		accesss, _ := m.AccessList(jwt.Userid)
		accessList := AccesBool(accesss)
		//		比较url和权限列表
		beego.Debug(urls, accessList)
		_, ok := accessList[urls]
		if ok {
			return
		}
		retCtxErr(ctx, ErrPermission)
		//			ctx.Output.JSON(ErrPermission, true, false)

	}
}

//retCtxErr ctx返回错误
func retCtxErr(ctx *context.Context, e *ControllerError) {
	ctx.ResponseWriter.Header().Set("Access-Control-Allow-Origin", "*")                                 //允许访问源
	ctx.ResponseWriter.Header().Set("Access-Control-Allow-Methods", "OPTIONS,HEAD,GET,POST,PUT,DELETE") //允许post访问
	ctx.ResponseWriter.Header().Set("Access-Control-Allow-Headers", "Content-Type,Authorization")       //header的类型
	ctx.ResponseWriter.Header().Set("Access-Control-Max-Age", "1728000")
	ctx.ResponseWriter.Header().Set("Access-Control-Allow-Credentials", "true")
	ctx.ResponseWriter.Header().Set("content-type", "application/json") //返回数据格式是json
	ctx.ResponseWriter.WriteHeader(e.Status)
	ctx.Output.JSON(e, true, false)
	ctx.Abort(e.Status, e.Message)
}

//AccesBool 根据资源列表转换为{url：bool}型的对象
func AccesBool(acceslist []orm.Params) (accBool map[string]bool) {
	var url string
	acBool := make(map[string]bool)
	for _, v := range acceslist {
		url = v["Url"].(string)
		acBool[url] = true
		_, ok := v["children"]
		if ok {
			for _, d := range v["children"].([]map[string]interface{}) {
				url = d["Url"].(string)
				acBool[url] = true
			}
		}
	}
	return acBool
}

//AccessDecision 判断是否有权限
func AccessDecision(urls string, accessList map[string]bool) bool {
	//	params := strings.Split(strings.ToLower(urls), "/")
	//	if CheckAccess(urls) {
	//		s := fmt.Sprintf("%s/%s/%s", params[1], params[2], params[3])
	if len(accessList) < 1 {
		return false
	}
	beego.Debug("检查权限列表：：：：：：：：：：", urls, accessList)
	_, ok := accessList[urls]
	if ok != false {
		return true
	}
	//	} else {
	//		return true
	//	}
	return false
}

//Getjwt 获取jwt数据
func (c *CommonController) Getjwt() (*jwtbeego.EasyToken, string, error) {
	tokenstring := c.Ctx.Input.Header("Authorization")
	jwt, ts, err := jwtbeego.Parse(tokenstring)
	if err != nil {
		beego.Error(err)
		c.RetError(ErrToken)
		return nil, ts, err
	}
	return jwt, ts, nil
}

//Validjwt 验证token
func (c *CommonController) Validjwt() bool {
	tokenstring := c.Ctx.Input.Header("Authorization")
	jwt := jwtbeego.ValidateToken(tokenstring)
	//	if err != nil {
	//		beego.Error(err)
	//		return nil, err
	//	}
	return jwt
}

//GetUserByToken 从token中获取用户信息
func GetUserByToken(tokenString string) (user *m.User, err error) {
	jwt, _, err := jwtbeego.Parse(tokenString)
	if err != nil {
		beego.Error(err)
		//		c.RetError(ErrToken)
		return
	}
	user, err = m.GetUserById(jwt.Userid)
	if err != nil {
		return
	}
	return
}
